Coverage Report

Created: 2026-03-18 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
D:\a\scloud-dns\scloud-dns\src\main.rs
Line
Count
Source
1
use crate::config::Config;
2
use crate::exceptions::SCloudException;
3
use crate::workers::manager::StartGate;
4
use crate::workers::{SCloudWorker, WorkerType};
5
use std::path::Path;
6
use std::sync::Arc;
7
use tokio::sync::mpsc;
8
9
mod config;
10
mod dns;
11
mod exceptions;
12
mod utils;
13
mod workers;
14
15
#[tokio::main(flavor = "multi_thread", worker_threads = 8)]
16
0
async fn main() -> Result<(), SCloudException> {
17
0
    let config = Config::from_file(Path::new("./config/config.json"))?;
18
0
    utils::logging::init(config.logging.clone())?;
19
20
    #[cfg(target_os = "windows")]
21
    {
22
        use tokio::net::UdpSocket;
23
        use std::sync::Arc;
24
        use workers::types::listener::SHARED_UDP_SOCKET;
25
26
0
        let udp = UdpSocket::bind("0.0.0.0:5353")
27
0
            .await
28
0
            .map_err(|_| SCloudException::SCLOUD_WORKER_LISTENER_BIND_FAILED)?;
29
        // Buffer large pour compenser l'absence de SO_REUSEPORT
30
        // Le socket reçoit tout, les workers Tokio se partagent les appels recv_from
31
0
        SHARED_UDP_SOCKET.set(Arc::new(udp)).ok();
32
    }
33
34
0
    let gate = Arc::new(StartGate::new(1));
35
36
0
    let mut workers: Vec<Arc<SCloudWorker>> = vec![
37
0
        Arc::new(SCloudWorker::new(WorkerType::TCP_ACCEPTOR)?),
38
0
        Arc::new(SCloudWorker::new(WorkerType::TCP_ACCEPTOR)?),
39
0
        Arc::new(SCloudWorker::new(WorkerType::TCP_ACCEPTOR)?),
40
0
        Arc::new(SCloudWorker::new(WorkerType::DECODER)?),
41
0
        Arc::new(SCloudWorker::new(WorkerType::DECODER)?),
42
0
        Arc::new(SCloudWorker::new(WorkerType::DECODER)?),
43
0
        Arc::new(SCloudWorker::new(WorkerType::DECODER)?),
44
0
        Arc::new(SCloudWorker::new(WorkerType::CACHE_LOOKUP)?),
45
0
        Arc::new(SCloudWorker::new(WorkerType::CACHE_LOOKUP)?),
46
0
        Arc::new(SCloudWorker::new(WorkerType::CACHE_LOOKUP)?),
47
0
        Arc::new(SCloudWorker::new(WorkerType::QUERY_DISPATCHER)?),
48
0
        Arc::new(SCloudWorker::new(WorkerType::QUERY_DISPATCHER)?),
49
0
        Arc::new(SCloudWorker::new(WorkerType::QUERY_DISPATCHER)?),
50
0
        Arc::new(SCloudWorker::new(WorkerType::ZONE_MANAGER)?),
51
0
        Arc::new(SCloudWorker::new(WorkerType::ZONE_MANAGER)?),
52
0
        Arc::new(SCloudWorker::new(WorkerType::RESOLVER)?),
53
0
        Arc::new(SCloudWorker::new(WorkerType::RESOLVER)?),
54
0
        Arc::new(SCloudWorker::new(WorkerType::RESOLVER)?),
55
0
        Arc::new(SCloudWorker::new(WorkerType::RESOLVER)?),
56
0
        Arc::new(SCloudWorker::new(WorkerType::RESOLVER)?),
57
0
        Arc::new(SCloudWorker::new(WorkerType::CACHE_WRITER)?),
58
0
        Arc::new(SCloudWorker::new(WorkerType::CACHE_WRITER)?),
59
0
        Arc::new(SCloudWorker::new(WorkerType::CACHE_WRITER)?),
60
0
        Arc::new(SCloudWorker::new(WorkerType::ENCODER)?),
61
0
        Arc::new(SCloudWorker::new(WorkerType::ENCODER)?),
62
0
        Arc::new(SCloudWorker::new(WorkerType::ENCODER)?),
63
0
        Arc::new(SCloudWorker::new(WorkerType::SENDER)?),
64
0
        Arc::new(SCloudWorker::new(WorkerType::SENDER)?),
65
0
        Arc::new(SCloudWorker::new(WorkerType::SENDER)?),
66
    ];
67
68
0
    workers::manager::channels_generation::generate_channels(workers.clone()).await;
69
0
    workers.sort_by_key(|w| w.get_worker_id());
70
71
0
    let mut handles: Vec<tokio::task::JoinHandle<()>> = Vec::new();
72
0
    for w in workers {
73
0
        handles.push(workers::spawn_worker(w, gate.clone()));
74
0
    }
75
76
0
    futures_util::future::pending::<()>().await;
77
0
    Ok(())
78
0
}